package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.DTO.property.PropertyProjectRemoveUnitInfoDTO;
import com.itlong.cloud.POJO.PO.UnitInfoPO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitSimpleInfoExVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitSimpleInfoVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      单元信息数据访问接口
 * </desc>
 * @createDate 2017-09-21.
 */
@Mapper
@Repository
public interface IPropertyUnitInfoDao extends IAbstractBaseDao<UnitInfoPO> {


    /**
     * <desc>
     *      保存单个单元信息
     * </desc>
     *
     * @param params 保存的参数
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-09-26
     */
    Integer save(Map<String,Object> params);

    /**
    * <desc>
    *       批量保存单元信息.
    * </desc>
    *
    * @param params 待保存的单元信息列表
    * @return 受影响的行数
    * @author LewisLouis
    * @createDate 2017-09-22
    */
    Integer batchSave(List<Map<String,Object>> params);



    /**
    * <desc>
    *       根据条件删除单元信息.
    * </desc>
    *
    * @param  propertyProjectRemoveUnitInfoDTO 删除单元信息数据传输对象
    * @return 受影响的行数
    * @author LewisLouis
    * @createDate 2017-09-27
    */
    Integer remove(PropertyProjectRemoveUnitInfoDTO propertyProjectRemoveUnitInfoDTO);



    /**
     * <desc>
     *      修改单元信息【根据单元Id（UnitId）】
     * </desc>
     *
     * @param params 保存的参数
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    Integer update(Map<String,Object> params);

    /**
     * <desc>
     *      批量更新单元信息（导入Excel时会使用）
     * </desc>
     *
     * @param params 待更新的单元信息列表
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    Integer batchUpdate(List<Map<String, Object>> params);

    /**
     * <desc>
     *      分页查询单元信息
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author LewisLouis
     * @createDate 2017-09-28
     */
    List<PropertyProjectUnitInfoVO> getPageList(Map<String,Object> params);


    /**
     * <desc>
     *      分页查询指定楼栋下的单元简单信息（单元id ,单元名称）列表
     * </desc>
     *
     * @param params 查询参数
     * @return 单元简单信息（单元id ,单元名称）列表
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    List<PropertyProjectUnitSimpleInfoVO> getPageUnitSimpleInfoList(Map<String,Object> params);


    /**
     * <desc>
     *      分页查询指定楼栋下的单元简单扩展信息（单元id ,单元名称，房间数量）列表
     * </desc>
     *
     * @param params 查询参数
     * @return 单元简单信息（单元id ,单元名称，房间数量）列表
     * @author LewisLouis
     * @createDate 2017-11-10
     */
    List<PropertyProjectUnitSimpleInfoExVO> getPageUnitSimpleInfoExList(Map<String,Object> params);

    /**
     * <desc>
     *      精确查询，获取单个单元信息
     * </desc>
     * @param unitInfoPO 查询单元信息数据传输对象
     * @return 按创建时间降序排列，首个符合查询条件的单元信息
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    PropertyProjectUnitInfoVO getOneUnitInfo(UnitInfoPO unitInfoPO);

    /**
     * <desc>
     *      获取指定楼栋下的单元编号(UnitNum)列表
     * </desc>
     *
     * @param buildId 指定楼栋Id
     * @return 单元编号(UnitNum)列表
     * @author LewisLouis
     * @createDate 2017-09-26
     */
    List<String> getUnitNumList(@Param("buildId")String buildId);


    /**
     * <desc>
     *      获取单元信息记录总数
     * </desc>
     *
     * @param params 查询参数
     * @return 记录总行数
     * @author LewisLouis
     * @createDate 2017-09-28
     */
    Integer getRecordCount(Map<String,Object> params);

    /**
     * <desc>
     *      查询楼栋下的单元id集合
     * <desc/>
     * @param  buildIds 楼栋ID,多个以英文，分隔，如 11111111，22222222
     * @return  该楼栋下所有的单元ID集合
     * @author Biao.R
     * @createDate 2017/12/9
     */
    List<String> getUnitIdInBuildIds(@Param("buildIds") String buildIds);
    
    
    /**
    * <desc>
    *     获取指定项目下的单元代号列表.
    * </desc>
    *
    * @param projectId 项目编号
    * @return 单元代号列表
    * @author LewisLouis
    * @createDate 2017-12-10
    */
    List<String> getUnitAliasByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取所有的单元信息
     * </desc>
     * @return
     * @author wangzhi
     * @createDate 2018/08/21
     */
    List<UnitInfoPO> getAllUnitInfo();

    /**
     * <desc>
     *      添加新增加的单元权限组号
     * </desc>
     *
     * @param unitInfoPOList 待添加的单元数据集
     * @return 1 or 0
     * @author wangzhi
     * @createDate 2018/08/21
     */
    Integer updateUnitGroupNum(List<UnitInfoPO> unitInfoPOList);

    /**
     * <desc>
     *      获取已使用的最大单元组号
     * </desc>
     *
     * @param projectId 项目id
     * @return 已使用的最大单元组号
     * @author wangzhi
     * @createDate 2018/08/21
     */
    Integer getMaxUnitGroupNum(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目动态密码验证方式
     * </desc>
     *
     * @param projectId 项目id
     * @return 项目动态密码验证方式
     * @author wangzhi
     * @createDate 2018/08/21
     */
    Integer getProjectOtpOnline(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取单元权限组号各组号和数量字符串
     * </desc>
     *
     * @param projectId 项目id
     * @return 单元权限组号各组号和数量字符串
     * @author wangzhi
     * @createDate 2018/10/25
     */
    List<String> getUnitGroupNumGroupCountMap(@Param("projectId") String projectId);
}
